package edu.logica;

import com.sun.lwuit.Display;
import com.sun.lwuit.Image;
import edu.logica.util.Base64;
import java.io.DataOutputStream;

import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;

import edu.logica.util.CentralDatos;
import edu.logica.util.Constantes;
import edu.vista.AdminIntefaz;
import edu.vista.Dialogo;
import edu.vista.Loader;
import java.io.DataInputStream;
import java.io.IOException;

public class ManejadorBluetooth implements Runnable {

    // Objetos Bluetooth necesarios
    public LocalDevice dispositivoLocal;
    //dispositivo remoto
    public static RemoteDevice dispositivoRemoto;
    public DiscoveryAgent da;
    private String mensaje;
    private static ManejadorBluetooth miManejadorBluetooth;
    //objetos necesarios para establecer la conexion
    static StreamConnection con;
    static DataOutputStream out;
    static DataInputStream in;
    public static boolean fin = false;
    static Thread hilo;

    private ManejadorBluetooth() {
    }

    public static ManejadorBluetooth getManejadorBluetooth() {
        if (miManejadorBluetooth == null) {
            miManejadorBluetooth = new ManejadorBluetooth();
        }

        return miManejadorBluetooth;
    }

    public void destruir() {
        fin = true;
        // Cerramos la conexion
        try {
            if (out != null) {

                out.close();
            }
            if (in != null) {

                in.close();
            }
            if (con != null) {

                con.close();
            }


        } catch (IOException e) {
            e.printStackTrace();
        }

        //mostrarAlarma(null, c, 2);s
        miManejadorBluetooth = null;
    }

    public Exception buscarDispositivos() {

        try {
            // Ponemos el dispositivo en modo General Discoverable Mode
            dispositivoLocal = LocalDevice.getLocalDevice();
            // General/Unlimited Inquiry Access Code (GIAC)
            dispositivoLocal.setDiscoverable(DiscoveryAgent.GIAC);
            da = dispositivoLocal.getDiscoveryAgent();
            da.startInquiry(DiscoveryAgent.GIAC, new ListenerCliente(this));
        } catch (BluetoothStateException e) {
            return e;
        }
        return null;
    }

    public Exception buscarServicios() {
        System.out.println("ManejadorBluetooth.buscarServicios()");
        CentralDatos.servicios_encontrados.removeAllElements();
        // Buscamos el servicio de puerto serie en el dispositivo
        // seleccionado
        dispositivoRemoto = (RemoteDevice) CentralDatos.dispositivos_encontrados.elementAt(CentralDatos.dispositivo_seleccionado);
        System.out.println(dispositivoRemoto);
        try {
            da.searchServices(null, new UUID[]{new UUID(0x0003)},
                    dispositivoRemoto, new ListenerCliente(this));
        } catch (BluetoothStateException be) {
            return be;
        } catch (NullPointerException e) {
//			System.out.println(e);
            e.printStackTrace();
            return e;
        }

        return null;
    }

    public void abrirCanal() {

        System.out.println("ABRIR CANAL linea 0");
        ServiceRecord sr = (ServiceRecord) CentralDatos.servicios_encontrados.elementAt(0);

        System.out.println("linea 1");
        // Obtenemos la URL asociada a este servicio en el dispositivo remoto

        String URL = sr.getConnectionURL(
                ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
        
        try {
            con = (StreamConnection) Connector.open(URL);

            out = con.openDataOutputStream();
            in = con.openDataInputStream();

        } catch (IOException e) {
            e.printStackTrace();
        }
//        Dialogo.getDialogo().mostrarDialogoInformacion("Conexion exitosa");
        hilo = new Thread(this);
        hilo.start();


    }

    public void enviarMensaje(String msg) {

        try {
            CentralDatos.respuesta = null;
            out.writeUTF(msg);
            out.flush();
            System.out.println("esperando respuesta");
            CentralDatos.loader = "por favor espere";
            final Loader l = new Loader();
            Thread t = new Thread() {

                public void run() {
//                    Dialogo.getDialogo().mostrarDialogoInformacion("comenzo la espera");
                    while (CentralDatos.respuesta == null) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
//                    Dialogo.getDialogo().mostrarDialogoInformacion("Respuesta: " + CentralDatos.respuesta);

//            codifcamos la respuesta con base 64
                    Base64 b64 = new Base64();
                    byte[] res = b64.decode(CentralDatos.respuesta);
//            creamos la imagen
                    CentralDatos.resultado = Image.createImage(res, 0, res.length);
//                    Dialogo.getDialogo().mostrarDialogoInformacion("Respuesta: " + CentralDatos.resultado);
//            ponemos el resultado
                    l.dispose();
//                    Dialogo.getDialogo().mostrarDialogoInformacion("l: " + l);
                    AdminIntefaz.getAdminIntefaz().setCurrent(Constantes.RESPUESTA);
                }
            };

            t.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        while (!fin) {
            try {
                //System.out.println("��??");
                //in = sc.openDataInputStream();
                // Leemos el mensaje y lo mostramos por pantalla
                String msj = in.readUTF();
//                Dialogo.getDialogo().mostrarDialogoInformacion("Respuesta de una (length): " + msj.length() + " bytes: " + msj.getBytes().length);
                CentralDatos.respuesta = msj;

            } catch (Exception e) {
                System.out.println("hay??");
                //	mostrarAlarma(e, this, 0);
                //	return;
            }
        }

    }
}
